package com.example.spring_aop.proxy;

import net.sf.cglib.proxy.Enhancer;

import java.lang.reflect.Proxy;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Li_yizYa
 * Date: 2025/7/24
 * Time: 17:22
 */
public class Main {
    public static void main(String[] args) {
        // 静态代理
//        HouseProxy proxy = new HouseProxy(new RealHouseSubject());
//        proxy.rent();
//        proxy.sale();

        // JDK 动态代理
        // 创建一个目标（即替哪个目标进行代理）
//        HouseSubject target = new RealHouseSubject();
//        // 运行时创建代理对象
//        HouseSubject proxy = (HouseSubject) Proxy.newProxyInstance(target.getClass().getClassLoader(),
//                target.getClass().getInterfaces(), new JDKInvocation(target));
//        proxy.rent();
//        proxy.sale();


        // CGLib 动态代理
        // 创建一个目标（即替哪个目标进行代理）
        HouseSubject target = new RealHouseSubject();
        // 运行时创建代理对象
        // 如果使用 CGLib运行的话，需要添加 vm option
        // --add-opens java.base/java.lang=ALL-UNNAMED
        HouseSubject proxy = (HouseSubject) Enhancer.create(target.getClass(), new CGLibMethodInterceptor(target));
        proxy.rent();
        proxy.sale();

    }
}
